{
  "cells": [
    {
      "cell_type": "markdown",
      "source": [
        "# Huber Regression"
      ],
      "metadata": {}
    },
    {
      "cell_type": "markdown",
      "source": [
        "Huber Regression is the Huber loss. A loss function used in robust regression and is less sensitive to outliers in data than the squared error loss. A variant for classification is also sometimes used. Therefore, huber regression is a technique that is robust to outliers.  "
      ],
      "metadata": {
        "nteract": {
          "transient": {
            "deleting": false
          }
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "import pandas as pd\n",
        "\n",
        "import warnings\n",
        "warnings.filterwarnings(\"ignore\")\n",
        "\n",
        "# yahoo finance is used to fetch data \n",
        "import yfinance as yf\n",
        "yf.pdr_override()"
      ],
      "outputs": [],
      "execution_count": 1,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false,
        "execution": {
          "iopub.status.busy": "2021-09-12T04:12:49.131Z",
          "iopub.execute_input": "2021-09-12T04:12:49.136Z",
          "shell.execute_reply": "2021-09-12T04:12:49.521Z",
          "iopub.status.idle": "2021-09-12T04:12:49.530Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# input\n",
        "symbol = 'AMD'\n",
        "start = '2014-01-01'\n",
        "end = '2018-08-27'\n",
        "\n",
        "# Read data \n",
        "dataset = yf.download(symbol,start,end)\n",
        "\n",
        "# View Columns\n",
        "dataset.head()"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "[*********************100%***********************]  1 of 1 completed\n"
          ]
        },
        {
          "output_type": "execute_result",
          "execution_count": 2,
          "data": {
            "text/plain": "            Open  High   Low  Close  Adj Close    Volume\nDate                                                    \n2014-01-02  3.85  3.98  3.84   3.95       3.95  20548400\n2014-01-03  3.98  4.00  3.88   4.00       4.00  22887200\n2014-01-06  4.01  4.18  3.99   4.13       4.13  42398300\n2014-01-07  4.19  4.25  4.11   4.18       4.18  42932100\n2014-01-08  4.23  4.26  4.14   4.18       4.18  30678700",
            "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>Open</th>\n      <th>High</th>\n      <th>Low</th>\n      <th>Close</th>\n      <th>Adj Close</th>\n      <th>Volume</th>\n    </tr>\n    <tr>\n      <th>Date</th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>2014-01-02</th>\n      <td>3.85</td>\n      <td>3.98</td>\n      <td>3.84</td>\n      <td>3.95</td>\n      <td>3.95</td>\n      <td>20548400</td>\n    </tr>\n    <tr>\n      <th>2014-01-03</th>\n      <td>3.98</td>\n      <td>4.00</td>\n      <td>3.88</td>\n      <td>4.00</td>\n      <td>4.00</td>\n      <td>22887200</td>\n    </tr>\n    <tr>\n      <th>2014-01-06</th>\n      <td>4.01</td>\n      <td>4.18</td>\n      <td>3.99</td>\n      <td>4.13</td>\n      <td>4.13</td>\n      <td>42398300</td>\n    </tr>\n    <tr>\n      <th>2014-01-07</th>\n      <td>4.19</td>\n      <td>4.25</td>\n      <td>4.11</td>\n      <td>4.18</td>\n      <td>4.18</td>\n      <td>42932100</td>\n    </tr>\n    <tr>\n      <th>2014-01-08</th>\n      <td>4.23</td>\n      <td>4.26</td>\n      <td>4.14</td>\n      <td>4.18</td>\n      <td>4.18</td>\n      <td>30678700</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
          },
          "metadata": {}
        }
      ],
      "execution_count": 2,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false,
        "execution": {
          "iopub.status.busy": "2021-09-12T04:12:49.538Z",
          "iopub.execute_input": "2021-09-12T04:12:49.558Z",
          "iopub.status.idle": "2021-09-12T04:12:50.260Z",
          "shell.execute_reply": "2021-09-12T04:12:50.298Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Create more data\n",
        "dataset['Increase_Decrease'] = np.where(dataset['Volume'].shift(-1) > dataset['Volume'],1,0)\n",
        "dataset['Buy_Sell_on_Open'] = np.where(dataset['Open'].shift(-1) > dataset['Open'],1,-1)\n",
        "dataset['Buy_Sell'] = np.where(dataset['Adj Close'].shift(-1) > dataset['Adj Close'],1,-1)\n",
        "dataset['Return'] = dataset['Adj Close'].pct_change()\n",
        "dataset = dataset.dropna()\n",
        "dataset.head()"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "execution_count": 3,
          "data": {
            "text/plain": "            Open  High   Low  Close  Adj Close    Volume  Increase_Decrease  \\\nDate                                                                          \n2014-01-03  3.98  4.00  3.88   4.00       4.00  22887200                  1   \n2014-01-06  4.01  4.18  3.99   4.13       4.13  42398300                  1   \n2014-01-07  4.19  4.25  4.11   4.18       4.18  42932100                  0   \n2014-01-08  4.23  4.26  4.14   4.18       4.18  30678700                  0   \n2014-01-09  4.20  4.23  4.05   4.09       4.09  30667600                  0   \n\n            Buy_Sell_on_Open  Buy_Sell    Return  \nDate                                              \n2014-01-03                 1         1  0.012658  \n2014-01-06                 1         1  0.032500  \n2014-01-07                 1        -1  0.012106  \n2014-01-08                -1        -1  0.000000  \n2014-01-09                -1         1 -0.021531  ",
            "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>Open</th>\n      <th>High</th>\n      <th>Low</th>\n      <th>Close</th>\n      <th>Adj Close</th>\n      <th>Volume</th>\n      <th>Increase_Decrease</th>\n      <th>Buy_Sell_on_Open</th>\n      <th>Buy_Sell</th>\n      <th>Return</th>\n    </tr>\n    <tr>\n      <th>Date</th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>2014-01-03</th>\n      <td>3.98</td>\n      <td>4.00</td>\n      <td>3.88</td>\n      <td>4.00</td>\n      <td>4.00</td>\n      <td>22887200</td>\n      <td>1</td>\n      <td>1</td>\n      <td>1</td>\n      <td>0.012658</td>\n    </tr>\n    <tr>\n      <th>2014-01-06</th>\n      <td>4.01</td>\n      <td>4.18</td>\n      <td>3.99</td>\n      <td>4.13</td>\n      <td>4.13</td>\n      <td>42398300</td>\n      <td>1</td>\n      <td>1</td>\n      <td>1</td>\n      <td>0.032500</td>\n    </tr>\n    <tr>\n      <th>2014-01-07</th>\n      <td>4.19</td>\n      <td>4.25</td>\n      <td>4.11</td>\n      <td>4.18</td>\n      <td>4.18</td>\n      <td>42932100</td>\n      <td>0</td>\n      <td>1</td>\n      <td>-1</td>\n      <td>0.012106</td>\n    </tr>\n    <tr>\n      <th>2014-01-08</th>\n      <td>4.23</td>\n      <td>4.26</td>\n      <td>4.14</td>\n      <td>4.18</td>\n      <td>4.18</td>\n      <td>30678700</td>\n      <td>0</td>\n      <td>-1</td>\n      <td>-1</td>\n      <td>0.000000</td>\n    </tr>\n    <tr>\n      <th>2014-01-09</th>\n      <td>4.20</td>\n      <td>4.23</td>\n      <td>4.05</td>\n      <td>4.09</td>\n      <td>4.09</td>\n      <td>30667600</td>\n      <td>0</td>\n      <td>-1</td>\n      <td>1</td>\n      <td>-0.021531</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
          },
          "metadata": {}
        }
      ],
      "execution_count": 3,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false,
        "execution": {
          "iopub.status.busy": "2021-09-12T04:12:50.269Z",
          "iopub.execute_input": "2021-09-12T04:12:50.274Z",
          "shell.execute_reply": "2021-09-12T04:12:50.302Z",
          "iopub.status.idle": "2021-09-12T04:12:50.313Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "dataset.shape"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "execution_count": 4,
          "data": {
            "text/plain": "(1170, 10)"
          },
          "metadata": {}
        }
      ],
      "execution_count": 4,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false,
        "execution": {
          "iopub.status.busy": "2021-09-12T04:12:50.319Z",
          "iopub.execute_input": "2021-09-12T04:12:50.324Z",
          "iopub.status.idle": "2021-09-12T04:12:50.332Z",
          "shell.execute_reply": "2021-09-12T04:12:50.304Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "X = dataset['Open']\n",
        "y = dataset['Adj Close'] "
      ],
      "outputs": [],
      "execution_count": 5,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false,
        "execution": {
          "iopub.status.busy": "2021-09-12T04:12:50.341Z",
          "iopub.execute_input": "2021-09-12T04:12:50.346Z",
          "iopub.status.idle": "2021-09-12T04:12:50.354Z",
          "shell.execute_reply": "2021-09-12T04:12:50.411Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "X = np.array(X).reshape(1170,-1)\n",
        "y = np.array(y).reshape(1170,-1)"
      ],
      "outputs": [],
      "execution_count": 6,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2021-09-12T04:12:50.362Z",
          "iopub.execute_input": "2021-09-12T04:12:50.368Z",
          "iopub.status.idle": "2021-09-12T04:12:50.376Z",
          "shell.execute_reply": "2021-09-12T04:12:50.414Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.linear_model import HuberRegressor\n",
        "from sklearn.model_selection import cross_val_score\n",
        "from sklearn.model_selection import RepeatedKFold\n",
        "from numpy import absolute, arange"
      ],
      "outputs": [],
      "execution_count": 7,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false,
        "execution": {
          "iopub.status.busy": "2021-09-12T04:12:50.384Z",
          "iopub.execute_input": "2021-09-12T04:12:50.390Z",
          "shell.execute_reply": "2021-09-12T04:12:50.596Z",
          "iopub.status.idle": "2021-09-12T04:12:50.606Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Define the model\n",
        "model = HuberRegressor()\n",
        "# Define model evaluation\n",
        "cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)\n",
        "# Evaluate model\n",
        "scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cv=cv, n_jobs=-1)\n",
        "# Change scores to be positive\n",
        "scores = absolute(scores)\n",
        " "
      ],
      "outputs": [],
      "execution_count": 8,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false,
        "execution": {
          "iopub.status.busy": "2021-09-12T04:12:50.634Z",
          "iopub.execute_input": "2021-09-12T04:12:50.642Z",
          "shell.execute_reply": "2021-09-12T04:12:55.174Z",
          "iopub.status.idle": "2021-09-12T04:12:55.155Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "model.fit(X, y)\n",
        "plt.scatter(X,y)\n",
        "xaxis = arange(X.min(), X.max(), 0.01)\n",
        "y_pred = model.predict(xaxis.reshape((len(xaxis), 1)))\n",
        "plt.plot(xaxis, y_pred, color='r')\n",
        "plt.title('Huber Regression for Stock Price')\n",
        "plt.show()"
      ],
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": "<Figure size 432x288 with 1 Axes>",
            "image/png": "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\n"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ],
      "execution_count": 9,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2021-09-12T04:12:55.164Z",
          "iopub.execute_input": "2021-09-12T04:12:55.168Z",
          "shell.execute_reply": "2021-09-12T04:12:55.274Z",
          "iopub.status.idle": "2021-09-12T04:12:55.231Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "def evaluate_model(X, y, model):\n",
        "\t# Define model evaluation\n",
        "\tcv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)\n",
        "\t# Evaluate model\n",
        "\tscores = cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cv=cv, n_jobs=-1)\n",
        "\t# Scores to be positive\n",
        "\treturn absolute(scores)"
      ],
      "outputs": [],
      "execution_count": 10,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2021-09-12T04:12:55.237Z",
          "iopub.execute_input": "2021-09-12T04:12:55.241Z",
          "iopub.status.idle": "2021-09-12T04:12:55.249Z",
          "shell.execute_reply": "2021-09-12T04:12:55.278Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "results = evaluate_model(X, y, model) \n",
        "print('Average MAE: %.3f (%.3f)' % (results.mean(), results.std())) "
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Average MAE: 0.146 (0.019)\n"
          ]
        }
      ],
      "execution_count": 11,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false,
        "execution": {
          "iopub.status.busy": "2021-09-12T04:12:55.256Z",
          "iopub.execute_input": "2021-09-12T04:12:55.262Z",
          "iopub.status.idle": "2021-09-12T04:12:59.910Z",
          "shell.execute_reply": "2021-09-12T04:12:59.902Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "model.coef_"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "execution_count": 12,
          "data": {
            "text/plain": "array([0.99989982])"
          },
          "metadata": {}
        }
      ],
      "execution_count": 12,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2021-09-12T04:12:59.919Z",
          "iopub.execute_input": "2021-09-12T04:12:59.925Z",
          "iopub.status.idle": "2021-09-12T04:12:59.935Z",
          "shell.execute_reply": "2021-09-12T04:13:00.024Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "model.intercept_"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "execution_count": 13,
          "data": {
            "text/plain": "-0.0006474743872614078"
          },
          "metadata": {}
        }
      ],
      "execution_count": 13,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2021-09-12T04:12:59.942Z",
          "iopub.execute_input": "2021-09-12T04:12:59.947Z",
          "iopub.status.idle": "2021-09-12T04:12:59.957Z",
          "shell.execute_reply": "2021-09-12T04:13:00.027Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "model.predict(y)"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "execution_count": 14,
          "data": {
            "text/plain": "array([ 3.99895182,  4.12893891,  4.17893362, ..., 20.89725846,\n       22.28712052, 23.97694984])"
          },
          "metadata": {}
        }
      ],
      "execution_count": 14,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2021-09-12T04:12:59.964Z",
          "iopub.execute_input": "2021-09-12T04:12:59.970Z",
          "iopub.status.idle": "2021-09-12T04:12:59.983Z",
          "shell.execute_reply": "2021-09-12T04:13:00.029Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.metrics import r2_score \n",
        "r2_score(X,y)"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "execution_count": 15,
          "data": {
            "text/plain": "0.9976522993458272"
          },
          "metadata": {}
        }
      ],
      "execution_count": 15,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2021-09-12T04:12:59.992Z",
          "iopub.execute_input": "2021-09-12T04:13:00.000Z",
          "iopub.status.idle": "2021-09-12T04:13:00.012Z",
          "shell.execute_reply": "2021-09-12T04:13:00.031Z"
        }
      }
    }
  ],
  "metadata": {
    "kernel_info": {
      "name": "python3"
    },
    "language_info": {
      "name": "python",
      "version": "3.6.13",
      "mimetype": "text/x-python",
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "pygments_lexer": "ipython3",
      "nbconvert_exporter": "python",
      "file_extension": ".py"
    },
    "kernelspec": {
      "name": "python3",
      "language": "python",
      "display_name": "Python 3"
    },
    "nteract": {
      "version": "0.28.0"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 4
}